package com.project.common.utils;

import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.framework.core.convert.impl.CollectionConverter;
import com.framework.core.result.BasePage;

import java.util.List;

/**
* @Description:   列表返回数据转换
* @Author:         wangzhiqiang
* @CreateDate:     2019-03-09 10:07
* @Version:        1.0
*/
public class IpageToPage<T> {

    private BasePage<T> basePage;

    public IpageToPage(IPage iPage, Class<T> clazz){
        this.basePage = new BasePage<>();
        this.basePage.setPageNo((int)iPage.getCurrent());
        this.basePage.setPageSize((int)iPage.getSize());
        this.basePage.setPages((int)iPage.getPages());
        this.basePage.setTotal((int)iPage.getTotal());
        if(null != iPage.getRecords() && iPage.getRecords().size() > 0){
            if (!iPage.getRecords().get(0).getClass().equals(clazz)){
                if (!iPage.getRecords().get(0).getClass().equals(clazz)){
                    CollectionConverter collectionConverter = new CollectionConverter(List.class, clazz);
                    this.basePage.setData((List<T>) collectionConverter.convert(iPage.getRecords(), null));
                }
            }else {
                this.basePage.setData(iPage.getRecords());
            }
        }
        this.setBasePage(basePage);
    }

    public IpageToPage(Page page, Class<T> clazz){
        this.basePage = new BasePage<>();
        this.basePage.setPageNo((int)page.getCurrent());
        this.basePage.setPageSize((int)page.getSize());
        this.basePage.setPages((int)page.getPages());
        this.basePage.setTotal((int)page.getTotal());
        if(null != page.getRecords() && page.getRecords().size() > 0){
            if (!page.getRecords().get(0).getClass().equals(clazz)){
                CollectionConverter collectionConverter = new CollectionConverter(List.class, clazz);
                this.basePage.setData((List<T>) collectionConverter.convert(page.getRecords(), null));
            }else {
                this.basePage.setData(page.getRecords());
            }
        }
        this.setBasePage(basePage);
    }

    /**
     * Ipage转BasePage
     * @param iPage
     * @param clazz
     * @param <T>
     * @return
     */
    public static <T> BasePage<T> toBasePage(IPage iPage, Class<T> clazz){
        return new IpageToPage(iPage, clazz).getBasePage();
    }

    /**
     * Page转BasePage
     * @param page
     * @param clazz
     * @param <T>
     * @return
     */
    public static <T> BasePage<T> toBasePage(Page page, Class<T> clazz){
        return new IpageToPage(page, clazz).getBasePage();
    }

    public BasePage<T> getBasePage() {
        return basePage;
    }

    public void setBasePage(BasePage<T> basePage) {
        this.basePage = basePage;
    }

}
